package main;

import java.io.Serializable;
import java.util.Date;
import java.util.Scanner;

import model.Acao;
import model.Cidadao;
import model.Contato;
import dao.DAO;
import dao.GenericDAOImp;

public class Principal {

	private static Scanner ler;

	public static void main(String[] args) {
		/*
		 * 6. Escolha pelo menos duas classes e desenvolva um CRUD (create,
		 * retrieve, update, delete) para a aplicação.
		 *
		 * 5. Faça o mapeamento do modelo E-R (usado na questão 3) para modelo 
		 * orientado a objeto criando as classes JPA e gere o modelo relacional de forma 
		 * automática. Compare com o resultado do mapeamento realizado na questão 3. 
		 * Mostre as diferenças e semelhanças.
		 * 
		 */

		boolean continua = true;
		ler = new Scanner(System.in);
		// persistirValores();

		while (continua) {

			System.out.println("1 - Adicionar Ação.");
			System.out.println("2 - Recuparar Ação.");
			System.out.println("3 - Atualizar Ação.");
			System.out.println("4 - Remover Ação.");
			System.out.println("5 - Adicionar Cidadão.");
			System.out.println("6 - Recuperar Cidadão.");
			System.out.println("7 - Atualizar Cidadão.");
			System.out.println("8 - Remover Cidadão.");

			System.out.println("0 - Finalizar.");

			int op = Integer.parseInt(ler.next());

			switch (op) {
			case 1:
				createAcao();
				break;

			case 2:
				retrieveAcao();
				break;

			case 3:
				updateAcao();
				break;

			case 4:
				deleteAcao();
				break;

			case 5:
				createCidadao();
				break;

			case 6:
				retrieveCidadao();
				break;

			case 7:
				updateCidadao();
				break;

			case 8:
				deleteCidadao();
				break;

			case 0:
				continua = false;
				break;
			}
		}
	}

	// ----------------------------Entidade Ação----------------------------------------
	private static void createAcao() {
		DAO<Acao> DAOAcao = new DAO<Acao>(Acao.class);
		Acao acao = new Acao();

		// informações da ação
		System.out.println("Digite a Descrição:");
		String descricao = ler.next();
		acao.setDescricao(descricao);
		acao.setDataInclusao(new Date());

		DAOAcao.adiciona(acao);
	}

	private static void retrieveAcao() {
		DAO<Acao> DAOAcao = new DAO<Acao>(Acao.class);
		for (Acao ac : DAOAcao.getAll()) {
			System.out.println("----------------------------");
			System.out.println("Id: " + ac.getId());
			System.out.println("Descrição: " + ac.getDescricao());
			System.out.println("Data da Inclusão: " + ac.getDataInclusao());
			System.out.println("----------------------------");
		}
	}

	private static void updateAcao() {
		DAO<Acao> DAOAcao = new DAO<Acao>(Acao.class);

		System.out.println("Digite o Id da Ação:");
		Long id = ler.nextLong();

		System.out.println("Digite a Descrição da Ação:");
		String descricao = ler.next();

		Acao a = DAOAcao.buscaPorId(id);
		a.setDescricao(descricao);
		DAOAcao.atualiza(a);
	}

	private static void deleteAcao() {
		DAO<Acao> DAOAcao = new DAO<Acao>(Acao.class);

		System.out.println("Digite o Id da Ação:");
		Long id = ler.nextLong();

		Acao a = DAOAcao.buscaPorId(id);
		DAOAcao.delete(a);
	}
	
// ----------------------------Entidade Cidadão----------------------------------------
	private static void createCidadao() {
		DAO<Cidadao> DAOCidadao = new DAO<Cidadao>(Cidadao.class);
		Cidadao c = new Cidadao();
		Contato t = new Contato();

		// informações de cidadão
		System.out.println("Digite o Nome:");
		String nome = ler.next();
		c.setNome(nome);

		System.out.println("Digite o Endereço:");
		String endereco = ler.next();
		c.setEndereco(endereco);

		System.out.println("Digite o Login:");
		String login = ler.next();
		c.setLogin(login);

		System.out.println("Digite a Senha:");
		String senha = ler.next();
		c.setSenha(senha);

		System.out.println("Digite o Grau de Satistafação:");
		String grau = ler.next();
		c.setGrauSatisfacao(grau);

		System.out.println("Digite o Comentário:");
		String comentario = ler.next();
		c.setComentario(comentario);

		System.out.println("Digite a Data da Avaliação:");
		String data = ler.next();
		c.setDataAvaliacao(data);

		// informações de contato
		System.out.println("Digite o tipo do contato:");
		String tipo = ler.next();
		t.setTipo(tipo);

		System.out.println("Digite o ddd:");
		int ddd = ler.nextInt();
		t.setDdd(ddd);

		System.out.println("Digite o numero:");
		String numero = ler.next();
		t.setNumero(numero);

		// persistindo cidadão
		c.getContatos().add(t);
		DAOCidadao.adiciona(c);
	}
	
	private static void retrieveCidadao() {
		DAO<Cidadao> DAOCidadao = new DAO<Cidadao>(Cidadao.class);
		for (Cidadao c : DAOCidadao.getAll()) {
			System.out.println("----------------------------");
			System.out.println("Id: " + c.getId());
			System.out.println("Nome: " + c.getNome());
			System.out.println("Endereço: " + c.getEndereco());
			System.out.println("----------------------------");
		}
	}
	
	private static void updateCidadao() {
		GenericDAOImp<Cidadao, Serializable> DAOCidadao = new GenericDAOImp<Cidadao, Serializable>(Cidadao.class);
		
		System.out.println("Digite o Id do cidadão");
		Long id = ler.nextLong();
		Cidadao c = DAOCidadao.getById(id);
		Contato t = new Contato();
		
		// informações de cidadão
		System.out.println("Digite o Nome:");
		String nome = ler.next();
		c.setNome(nome);

		System.out.println("Digite o Endereço:");
		String endereco = ler.next();
		c.setEndereco(endereco);

		System.out.println("Digite o Login:");
		String login = ler.next();
		c.setLogin(login);

		System.out.println("Digite a Senha:");
		String senha = ler.next();
		c.setSenha(senha);

		System.out.println("Digite o Grau de Satistafação:");
		String grau = ler.next();
		c.setGrauSatisfacao(grau);

		System.out.println("Digite o Comentário:");
		String comentario = ler.next();
		c.setComentario(comentario);

		System.out.println("Digite a Data da Avaliação:");
		String data = ler.next();
		c.setDataAvaliacao(data);

		// informações de contato
		System.out.println("Digite o tipo do contato:");
		String tipo = ler.next();
		t.setTipo(tipo);

		System.out.println("Digite o ddd:");
		int ddd = ler.nextInt();
		t.setDdd(ddd);

		System.out.println("Digite o numero:");
		String numero = ler.next();
		t.setNumero(numero);
		
		//atualizando Entidade
		c.getContatos().add(t);
		DAOCidadao.update(c);
	}
	
	private static void deleteCidadao() {
		GenericDAOImp<Cidadao, Serializable> DAOCidadao = new GenericDAOImp<Cidadao, Serializable>(Cidadao.class);
		System.out.println("Digite o Id do Cidadao:");
		Long id = ler.nextLong();
		
		Cidadao c = DAOCidadao.getById(id);
		DAOCidadao.delete(c);
	}
}
